package org.mybatis.example;

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;

import java.util.Properties;

/**
 * MyBatis允许您在执行映射语句时拦截对特定点的调用。默认情况下，MyBatis允许插件拦截以下方法调用:
 *
 *   Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
 *   ParameterHandler (getParameterObject, setParameters)
 *   ResultSetHandler (handleResultSets, handleOutputParameters)
 *   StatementHandler (prepare, parameterize, batch, update, query)
 *
 *   这些类方法的详细信息可以通过查看每个类的完整方法签名和每个MyBatis发行版提供的源代码来发现。假设您所做的不仅仅是监视调用，
 *   那么您应该理解所覆盖的方法的行为。如果您试图修改或覆盖给定方法的行为，则可能会破坏MyBatis的核心。这些都是底层类和方法，所以使用插件时要小心。
 */
@Intercepts(@Signature(
  type = Executor.class, //返回的Java类型
  method = "update", //返回方法名称
  args={MappedStatement.class,Object.class} //返回方法参数对应的Java类型
))
public class ExamplePlugin implements Interceptor {
  private Properties properties=new Properties();


  @Override
  public Object intercept(Invocation invocation) throws Throwable {
    System.out.println("拦截之前做的动作。。。。");
    Object proceed = invocation.proceed();
    System.out.println("拦截之后做的动作。。。。");
    return proceed;
  }

  @Override
  public void setProperties(Properties property){
    properties=property;
  }
}
